package com.pay.controller.open.api;

import cn.hutool.extra.spring.SpringUtil;
import com.pay.common.core.api.base.BaseApiController;
import com.pay.common.core.api.base.BaseResponse;
import com.pay.controller.open.api.dto.req.PaymentChannelDTO;
import com.pay.controller.open.api.dto.req.PaymentInfoDTO;
import com.pay.entity.PaymentChannelDO;
import com.pay.entity.PaymentInfoDO;
import com.pay.service.open.api.OpenPaymentCoreService;
import com.pay.service.open.api.PaymentChannelService;
import com.pay.strategy.PayStrategy;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;

/**
 * @author 周益和
 * @ClassName OpenPaymentCoreController
 * @qq 1552951165
 */
@RestController
@RequestMapping("/api/v1")
@Api(tags = "API开放接口")
@Slf4j
public class OpenPaymentCoreController extends BaseApiController {
    @Autowired
    private OpenPaymentCoreService openPaymentCoreService;
    
    @Autowired
    private PaymentChannelService paymentChannelService;
    
    @PostMapping("/testToPay")
    @ApiOperation("测试接口")
    public BaseResponse<String> testToPay(@RequestBody(required = false) PaymentInfoDTO paymentInfoDTO) {
        return setResultSuccess();
    }
    
    /**
     * 商家后台形式将支付的内容信息 传递给我们极简支付
     * 极简支付返回对应的支付令牌
     *
     * @return
     */
    @PostMapping("/createPayToken")
    public BaseResponse<String> createPayToken( @RequestBody PaymentInfoDTO paymentInfoDto){
        // 1.验证参数
        String merchantId = paymentInfoDto.getMerchantId();
        if (StringUtils.isEmpty(merchantId)) {
            return setResultError("merchantId is null");
        }
        BigDecimal paymentAmount = paymentInfoDto.getPayAmount();
        if (StringUtils.isEmpty(paymentAmount)) {
            return setResultError("paymentAmount is null");
        }
        
        // 2.新增支付数据
        // 3.返回对应支付令牌给我们 商家
        String payToken = openPaymentCoreService.createPayToken(paymentInfoDto);
        log.info("<payToken：{}>", payToken);
        return setResultSuccessData(payToken);
    }
    
    /**
     * 参数1：支付渠道
     * 参数2：支付令牌 明文支付的参数
     * 联合登录（qq联合登录、微信联合登录、其他联合）
     * 对接第三方支付系统（支付宝、银联支付、平安支付以form表单将数据提交到第三方支付系统的）
     *
     * @return
     */
    @PostMapping("/toPay")
    public BaseResponse<String> toPay(@RequestBody PaymentChannelDTO paymentChannelDTO){
        // 1.验证参数
        String channelId = paymentChannelDTO.getChannelId();
        if (StringUtils.isEmpty(channelId)) {
            return setResultError("channelId is null");
        }
        
        String payToken = paymentChannelDTO.getPayToken();
        if (StringUtils.isEmpty(payToken)) {
            return setResultError("payToken is null");
        }
        
        // 2.根据支付令牌 获取支付的参数信息
        PaymentInfoDO payTokenPaymentInfo = openPaymentCoreService.getPayTokenPaymentInfo(payToken);
        if (payTokenPaymentInfo == null) {
            return setResultError("支付令牌错误");
        }
        
        // 3.根据渠道id 查询对应支付渠道
        PaymentChannelDO paymentChannelDO = paymentChannelService.getByChannelIdInfo(channelId);
        if (paymentChannelDO == null) {
            return setResultError("渠道错误或渠道已经关闭!");
        }
        
        // 4.从ioc容器 找到对应的bean数据 调用方法
        // payBeanId将用来从IOC容器中检索与支付相关的bean
        String payBeanId = paymentChannelDO.getPayBeanId();
        // 实际返回的bean是payBeanId对应的具体实现类,它被IOC容器管理并拥有依赖注入（dependency injection, DI）的相关属性。
        PayStrategy payStrategy = SpringUtil.getBean(payBeanId, PayStrategy.class);
        // 负责处理支付逻辑，并返回一个HTML字符串，表示支付页面或支付确认的用户界面。
        String toPayHtml = payStrategy.toPay(payTokenPaymentInfo, paymentChannelDO);
        log.info("<toPayHtml:{}>", toPayHtml);
        return setResultSuccessData(toPayHtml);
    }
    
    //    @PostMapping("toPay2")
    //    public BaseResponse<String> toPay2(
    //            @RequestBody
    //                    PaymentChannelDTO paymentChannelDto) {
    //        // 1.验证参数
    //        String channelId = paymentChannelDto.getChannelId();
    //        if (StringUtils.isEmpty(channelId)) {
    //            return setResultError("channelId is null");
    //        }
    //        String beanId = paymentChannelDto.getBeanId();
    //        if (StringUtils.isEmpty(beanId)) {
    //            return setResultError("beanId is null");
    //        }
    //        PayStrategy payStrategy = SpringUtil.getBean(beanId,
    //                PayStrategy.class);
    //        String result = payStrategy.toPay(null, null);
    //        return setResultSuccessData(result);
    ////        if("支付宝".equals(channelId)){
    ////            //调用支付宝接口
    ////        }
    ////        if("银联".equals(channelId)){
    ////            //调用银联接口
    ////        }
    ////        if("平安".equals(channelId)){
    ////            //调用平安接口
    ////        }
    ////        if("建设".equals(channelId)){
    ////            //调用建设接口
    ////        }
}